package com.diy.sigmund.diyoauth2.common.spring.config;

import com.diy.sigmund.diycommon.entity.constant.CommonConstant;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.provider.token.TokenEnhancer;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;

/**
 * @author ylm-sigmund
 * @since 2021/8/23 19:57
 */
@Configuration
public class JwtTokenConfig {

    /**
     * tokenStore通常情况为自定义实现，一般放置在缓存或者数据库中。此处可以利用自定义tokenStore来实现多种需求，如：
     *
     * 同已用户每次获取token，获取到的都是同一个token，只有token失效后才会获取新token。
     * 同一用户每次获取token都生成一个完成周期的token并且保证每次生成的token都能够使用（多点登录）。
     * 同一用户每次获取token都保证只有最后一个token能够使用，之前的token都设为无效（单点token）。
     * ————————————————
     * 版权声明：本文为CSDN博主「昵称2021」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
     * 原文链接：https://blog.csdn.net/bluuusea/article/details/80284458
     */
    @Bean
    public TokenStore customJwtTokenStore() {
        return new JwtTokenStore(jwtAccessTokenConverter());
    }

    /**
     * RSA密钥对的代码生成，key.startsWith("-----BEGIN");
     * RSA非对称加密串：
     * accessTokenConverter.setSigningKey(privateKey);
     * accessTokenConverter.setVerifierKey(privateKey);
     * 如果是要使用Mac加密：
     * accessTokenConverter.setSigningKey(privateKey);
     *
     * 由于库的实现方式，恐怕您无法摆脱以下警告，如果您实际使用 RSA 密钥，则可以使用setVerifierKey或setKeyPair方法来提供加密 RSA 材料。
     * Unable to create an RSA verifier from verifierKey (ignoreable if using MAC)
     *
     * @return JwtAccessTokenConverter
     */
    @Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter() {
        JwtAccessTokenConverter accessTokenConverter = new JwtAccessTokenConverter();
        accessTokenConverter.setSigningKey(CommonConstant.JWT_KEY);
        return accessTokenConverter;
    }

    @Bean
    public TokenEnhancer customJwtTokenEnhancer() {
        return new JwtTokenEnhancer();
    }
}
